############################################################################
#
# DIM - A Direct Interaction Manager for SAGE
# WindowAgent - Automated Space Organization Strategy for Large Display
# Copyright (C) 2007 Electronic Visualization Laboratory,
# University of Illinois at Chicago
#
# All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 
#  * Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#  * Redistributions in binary form must reproduce the above
#    copyright notice, this list of conditions and the following disclaimer
#    in the documentation and/or other materials provided with the distribution.
#  * Neither the name of the University of Illinois at Chicago nor
#    the names of its contributors may be used to endorse or promote
#    products derived from this software without specific prior written permission.
# 
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Direct questions, comments etc about SAGE UI to www.evl.uic.edu/cavern/forum
#
# Author: Hyejung Hur 
#        
############################################################################


import sys, string
from globals import *


### Class for User location, direciton information.
### It ing to where user is looking at. 
class User :
        
	def __init__(self, deviceId):
		# User ID
		self.id = deviceId 
		#print "[DEBUG] New user is created (id-" + str(self.id) + ")"

		# User has initial position
		#self.initial_pos = pos 
		#self.initial_dir = dir

		# for testing
		if deviceId.find("Hyejung") != -1 :
			self.initial_pos = 0.7*6144, 0.5*3072
		else :
			self.initial_pos = 0.2*6144, 0.5*3072

		# Viewing Frustum Preference
		# self.vfp =  

		# where to look at
		self.dir_x = 0
		self.dir_y = 0 
		self.deviceObj = None 

		self.focusedApp = None


	def updateLook(self, x, y):
		self.dir_x = x
		self.dir_y = y 
		#print "[DEBUG] clicked = " + str(x) + " " + str(y)

	def getLocation(self):
		return self.initial_pos

	def setDevice(self, obj):
		self.deviceObj = obj

	# wrong
	def move(self, x, y):
 		if self.deviceObj != None :
			self.deviceObj.test(x, y)
			#print "mouse is moved...."

	def setApp(self, app): 
		self.focusedApp = app

	def getApp(self): 
		return self.focusedApp

	def clear(self): 
		if self.focusedApp != None :
			self.focusedApp.outFocus(self.id)


### Class for managing Users
class Users :
        
	def __init__(self):
		# priority list 
		self.users = {} 

	# ---------
	def makeNewUser(self, deviceId): 
		user = User(deviceId)
		self.users[deviceId] = user 
		return user

	# ---------
	def removeUser(self, deviceId):
		if deviceId in self.users : 
			user =  self.users[ deviceId ]
			user.clear()
			del self.users[ deviceId ]
			# not sure this way users will removed... from the list
			#print "Debug.... user is removed...." + str(deviceId)

	# ---------
	def getUser(self, deviceId):
		if deviceId in self.users : 
			return self.users[ deviceId ]
		return None
